home *** CD-ROM | disk | FTP | other *** search
/ Ham Radio 2000 #1 / Ham Radio 2000.iso / ham2000 / hf / dsp / dsp4src / coder.asm < prev    next >
Encoding:
Assembly Source File  |  1993-02-13  |  8.5 KB  |  284 lines

  1.     page    132,63,1,1
  2.     opt    rc
  3.     title    'LPC Coefficients coder'
  4.  
  5. ;***************************************************************
  6. ;* CODER.ASM -- 2400 bit/s LPC Coefficients coder           *
  7. ;*                                   *
  8. ;* Encodes/Decodes reflection coefficients, gain and pitch to  *
  9. ;* one 48 bit block                           *
  10. ;*                                   *
  11. ;* Copyright (C) 1992 by Alef Null. All rights reserved.       *
  12. ;* Author(s): Jarkko Vuori, OH2LNS                   *
  13. ;* Modification(s):                           *
  14. ;***************************************************************
  15.  
  16.     section LPCcoder
  17.     xdef    lpc_encode,lpc_decode
  18.     xdef    lpcin,lpcout
  19.  
  20.     org    p:
  21.  
  22.     nolist
  23.     include 'macros'
  24.     list
  25.  
  26.  
  27. encode    macro    src,table,len,pos
  28.     move    src,x0
  29.     move    #table,r0
  30.     move    #>len,y0
  31.     if pos!=0
  32.         move    #>@cvi(@pow(2,pos-1)),y1
  33.     else
  34.         move    #0,y1
  35.     endif
  36.     jsr    <pack
  37.     endm
  38.  
  39. decode    macro    table,len,pos,dest
  40.     move    #table,r0
  41.     move    #>len-1,y0
  42.     if pos!=0
  43.         move    #>pos,y1
  44.     else
  45.         move    #0,y1
  46.     endif
  47.     jsr    <unpack
  48.     move    a,dest
  49.     endm
  50.  
  51.  
  52. ; Encode LPC parameters to 48 bit block
  53. lpc_encode
  54.     clr    a        #lpcout,r1
  55.     move            #-1,m0
  56.     move            a,x:(r1)
  57.     encode    x:<p_code,p_codes,64,18         ; pitch
  58.     encode    x:<g_code,g_codes,64,12         ; gain
  59.     encode    x:<k_code+1,k1_codes,16,8        ; k1
  60.     encode    x:<k_code+2,k2_codes,16,4        ; k2
  61.     encode    x:<k_code+3,k3_codes,16,0        ; k3
  62.  
  63.     clr    a        (r1)+
  64.     move            a,x:(r1)
  65.     encode    x:<k_code+9,k9_codes,8,21        ; k9
  66.     encode    x:<k_code+8,k8_codes,8,18        ; k8
  67.     encode    x:<k_code+7,k7_codes,8,15        ; k7
  68.     encode    x:<k_code+6,k6_codes,8,12        ; k6
  69.     encode    x:<k_code+5,k5_codes,8,9        ; k5
  70.     encode    x:<k_code+4,k4_codes,16,5        ; k4
  71.     encode    x:<k_code+0,k0_codes,32,0        ; k0
  72.  
  73.     rts
  74.  
  75.  
  76. ; Decode LPC parameters from 48 bit block
  77. lpc_decode
  78.     move            #-1,m0
  79.     move            #lpcin,r1
  80.     decode    p_decodes,64,18,x:<p_s            ; pitch
  81.     decode    g_decodes,64,12,x:<g_s            ; gain
  82.     decode    k1_decodes,16,8,x:<k_s+1        ; k1
  83.     decode    k2_decodes,16,4,x:<k_s+2        ; k2
  84.     decode    k3_decodes,16,0,x:<k_s+3        ; k3
  85.  
  86.     move            (r1)+
  87.     decode    k9_decodes,8,21,x:<k_s+9        ; k9
  88.     decode    k8_decodes,8,18,x:<k_s+8        ; k8
  89.     decode    k7_decodes,8,15,x:<k_s+7        ; k7
  90.     decode    k6_decodes,8,12,x:<k_s+6        ; k6
  91.     decode    k5_decodes,8,9,x:<k_s+5         ; k5
  92.     decode    k5_decodes,8,9,x:<k_s+5         ; k5
  93.     decode    k4_decodes,16,5,x:<k_s+4        ; k4
  94.     decode    k0_decodes,32,0,x:<k_s+0        ; k0
  95.  
  96.     rts
  97.  
  98.  
  99. ; Quantize argument and pack it
  100. ;   x0 - value to be quantized
  101. ;   r1 - pointer to target where the result is to be packed
  102. ;   r0 - quantization table pointer
  103. ;   y0 - number of quantization values
  104. ;   y1 - shift position
  105. pack    move            r0,x1            ; first search quantization value
  106.     move            x:(r0)+,a
  107.     do    y0,_gcode
  108.     cmp    x0,a
  109.     jlt    <_gcodes
  110.     enddo
  111.     jmp    <_gcode
  112. _gcodes move            x:(r0)+,a
  113. _gcode
  114.     move            (r0)-            ; then calculate its bit value
  115.     move            r0,a
  116.     sub    x1,a        y1,b
  117.  
  118.     tst    b        x:(r1),x1            ; shift the result to appropriate position
  119.     jeq    <_posok
  120.     move            a,y0            ; shift left
  121.     mpy    y0,y1,a
  122.     move            a0,a1
  123.  
  124. _posok    or    x1,a                    ; and add it to the result
  125.     move            a1,x:(r1)
  126.  
  127.     rts
  128.  
  129.  
  130. ; Unpack parameter and give its value
  131. ;   r1 - pointer to source where the result is to be fetched
  132. ;   r0 - quantization table pointer
  133. ;   y0 - bitmask
  134. ;   y1 - shift position
  135. unpack    move            y1,a            ; fetch quantized value
  136.     tst    a        x:(r1),b
  137.     jeq    <_posok
  138.     rep    y1
  139.     lsr    b
  140.  
  141. _posok    and    y0,b                    ; convert it to result
  142.     move            b1,n0
  143.     nop
  144.     move            y:(r0+n0),a
  145.  
  146.     rts
  147.  
  148.  
  149. ;****************************
  150. ;*     DATA - AREA        *
  151. ;****************************
  152.  
  153. ; The following tables are used for 2400 bps coding.
  154. ; They the index in the array to the first value less
  155. ; than or equal to the value to be coded represents the code.
  156. ; Gain tables are logarithmically coded in order to maximize dynamic
  157. ; levels and obey square root function.
  158. ; Other tables are based on TMS320C30 LPC Vocoder implementation.
  159.  
  160.     org    x:
  161.  
  162. lpcin    ds    2                    ; 48 bit coded parameters
  163. lpcout    ds    2                    ; 48 bit coded parameters
  164.  
  165. g_codes
  166. dum    set    0
  167.     dup    64
  168.     dc    @pow(@xpn(@cvf(dum-63)/7.0),2.0)
  169. dum    set    dum+1
  170.     endm
  171.  
  172. p_codes dc    0,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31
  173.     dc    32,33,34,35,36,37,39,40,42,44,46,48,50,52,54,56
  174.     dc    58,61,63,66,69,72,74,77,80,83,87,90,94,98,102,106
  175.     dc    111,115,120,124,129,135,140,146,152,158,165,172,178,185,193,32767
  176.  
  177. k0_codes dc    -9.55048e-01,-9.37592e-01,-9.18121e-01,-8.97949e-01
  178.     dc    -8.74268e-01,-8.48053e-01,-8.19855e-01,-7.89185e-01
  179.     dc    -7.56073e-01,-7.19574e-01,-6.80115e-01,-6.38123e-01
  180.     dc    -5.92133e-01,-5.42633e-01,-4.87457e-01,-4.26727e-01
  181.     dc    -3.59741e-01,-2.88483e-01,-2.07733e-01,-1.24878e-01
  182.     dc    -3.47900e-02,6.03333e-02,1.52863e-01,2.55432e-01
  183.     dc    3.54248e-01,4.49585e-01,5.42542e-01,6.40015e-01
  184.     dc    7.35138e-01,8.13599e-01,8.73596e-01,9.99969e-01
  185.  
  186. k1_codes dc    -4.02374e-01,-2.53571e-01,-1.25000e-01,-1.08948e-02
  187.     dc    9.46045e-02,1.94031e-01,2.85522e-01,3.72040e-01
  188.     dc    4.54041e-01,5.31738e-01,6.06720e-01,6.79169e-01
  189.     dc    7.46094e-01,8.10913e-01,8.67310e-01,9.99969e-01
  190.  
  191. k2_codes dc    -6.89941e-01,-5.97595e-01,-5.14465e-01,-4.32007e-01
  192.     dc    -3.48572e-01,-2.67548e-01,-1.85059e-01,-9.79309e-02
  193.     dc    -8.14819e-03,8.36792e-02,1.75079e-01,2.68127e-01
  194.     dc    3.66760e-01,4.70978e-01,5.89172e-01,9.99969e-01
  195.  
  196. k3_codes dc    -3.65662e-01,-2.57019e-01,-1.68213e-01,-8.74634e-02
  197.     dc    -1.25732e-02,5.56641e-02,1.22009e-01,1.87286e-01
  198.     dc    2.52411e-01,3.18146e-01,3.85803e-01,4.57825e-01
  199.     dc    5.37445e-01,6.25793e-01,7.18903e-01,9.99969e-01
  200.  
  201. k4_codes dc    -4.01245e-01,-3.02185e-01,-2.20673e-01,-1.47827e-01
  202.     dc    -8.15430e-02,-1.98059e-02,4.00391e-02,9.93042e-02
  203.     dc    1.59424e-01,2.20825e-01,2.85553e-01,3.53851e-01
  204.     dc    4.32190e-01,5.22919e-01,6.31531e-01,9.99969e-01
  205.  
  206. k5_codes dc    -1.40167e-01,8.27026e-03,1.28906e-01,2.43042e-01
  207.     dc    3.63312e-01,4.88190e-01,6.21246e-01,9.99969e-01
  208.  
  209. k6_codes dc    -2.79236e-01,-1.26251e-01,-2.74658e-03,1.09100e-01
  210.     dc    2.24518e-01,3.54706e-01,5.10498e-01,9.99969e-01
  211.  
  212. k7_codes dc    -2.13196e-01,-7.72400e-02,3.59497e-02,1.44073e-01
  213.     dc    2.65991e-01,4.18549e-01,5.77789e-01,9.99969e-01
  214.  
  215. k8_codes dc    -2.72003e-01,-1.56097e-01,-6.65894e-02,1.22070e-02
  216.     dc    9.06677e-02,1.79260e-01,3.01880e-01,9.99969e-01
  217.  
  218. k9_codes dc    -1.97052e-01,-1.07269e-01,-3.49731e-02,3.17078e-02
  219.     dc    1.00159e-01,1.77277e-01,2.78564e-01,9.99969e-01
  220.  
  221.  
  222.     org    y:
  223.  
  224. g_decodes
  225.     dc    0
  226. dum    set    1
  227.     dup    64-1
  228.     dc    @xpn(@cvf(dum-63)/7.0)
  229. dum    set    dum+1
  230.     endm
  231.  
  232. p_decodes dc    0,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31
  233.     dc    32,33,34,35,36,37,39,40,41,43,45,47,49,51,53,55
  234.     dc    57,60,62,65,68,71,73,76,79,82,86,89,92,96,100,104,109
  235.     dc    113,118,122,127,132,138,143,149,155,162,169,175,182,189,197
  236.  
  237. k0_decodes dc    -9.63440e-01,-9.46167e-01,-9.28223e-01,-9.08356e-01
  238.     dc    -8.86292e-01,-8.61420e-01,-8.34320e-01,-8.04901e-01
  239.     dc    -7.72797e-01,-7.38586e-01,-7.00256e-01,-6.59393e-01
  240.     dc    -6.16089e-01,-5.67841e-01,-5.14984e-01,-4.57184e-01
  241.     dc    -3.94806e-01,-3.23730e-01,-2.48962e-01,-1.65771e-01
  242.     dc    -8.12683e-02,1.37939e-02,1.06323e-01,2.04132e-01
  243.     dc    3.05695e-01,4.03778e-01,4.95178e-01,5.89935e-01
  244.     dc    6.89148e-01,7.75482e-01,8.45001e-01,8.96667e-01
  245.  
  246. k1_decodes dc    -4.91791e-01,-3.23212e-01,-1.87592e-01,-6.70166e-02
  247.     dc    4.23584e-02,1.45294e-01,2.40448e-01,3.29926e-01
  248.     dc    4.13452e-01,4.93378e-01,5.68726e-01,6.43280e-01
  249.     dc    7.13745e-01,7.78473e-01,8.40088e-01,8.96667e-01
  250.  
  251. k2_decodes dc    -7.40662e-01,-6.41907e-01,-5.55847e-01,-4.72900e-01
  252.     dc    -3.90411e-01,-3.07770e-01,-2.26837e-01,-1.40869e-01
  253.     dc    -5.40161e-02,3.87573e-02,1.28571e-01,2.21344e-01
  254.     dc    3.15979e-01,4.16748e-01,5.28748e-01,6.58478e-01
  255.  
  256. k3_decodes  dc    -4.32495e-01,-3.08533e-01,-2.10876e-01,-1.27136e-01
  257.     dc    -4.96826e-02,2.18811e-02,8.95386e-02,1.54602e-01
  258.     dc    2.19391e-01,2.85400e-01,3.51562e-01,4.20746e-01
  259.     dc    4.97223e-01,5.80933e-01,6.71021e-01,7.75757e-01
  260.  
  261. k4_decodes  dc    -4.66675e-01,-3.47412e-01,-2.60071e-01,-1.83228e-01
  262.     dc    -1.13983e-01,-5.02625e-02,1.04980e-02,6.94580e-02
  263.     dc    1.29456e-01,1.89697e-01,2.53113e-01,3.18848e-01
  264.     dc    3.90961e-01,4.77051e-01,5.73639e-01,6.90735e-01
  265.  
  266. k5_decodes  dc    -2.37793e-01,-6.14929e-02,7.08008e-02,1.85760e-01
  267.     dc    3.01697e-01,4.25049e-01,5.54657e-01,6.99585e-01
  268.  
  269. k6_decodes  dc    -3.77716e-01,-1.98029e-01,-6.22253e-02,5.45044e-02
  270.     dc    1.65771e-01,2.87018e-01,4.29474e-01,6.10352e-01
  271.  
  272. k7_decodes  dc    -3.04535e-01,-1.41754e-01,-1.86462e-02,8.90808e-02
  273.     dc    2.02698e-01,3.38226e-01,4.97986e-01,6.58142e-01
  274.  
  275. k8_decodes  dc    -3.49945e-01,-2.09595e-01,-1.08887e-01,-2.65198e-02
  276.     dc    5.10559e-02,1.32782e-01,2.34582e-01,3.99811e-01
  277.  
  278. k9_decodes  dc    -2.60620e-01,-1.48865e-01,-7.00989e-02,-1.22070e-03
  279.     dc    6.48804e-02,1.36963e-01,2.23297e-01,3.56262e-01
  280.  
  281.     endsec
  282.  
  283.     end
  284.